package com.example.ssmDemo.business.user.controller;

/**
 * 模块名称：
 * 模块类型：
 * 编码人：刘彬
 * 生成时间：2023/2/21
 * 联系电话：
 * */
import com.example.ssmDemo.business.student.controller.StudentController;
import com.example.ssmDemo.business.user.dto.User;
import com.example.ssmDemo.business.user.service.UserService;
import com.example.ssmDemo.core.dto.MyPager;
import com.example.ssmDemo.core.dto.MyResult;
import com.example.ssmDemo.mybatis.domain.student.StudentDO;
import com.example.ssmDemo.business.student.service.StudentService;
import com.example.ssmDemo.mybatis.domain.user.UserDO;
import com.wf.captcha.GifCaptcha;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.HashSet;

/**
 * 学生基础信息采集模块-控制器层
 * 2022/6/1
 */
@Controller
@RequestMapping("/user")
@Slf4j //日志注解 自动生成一个log对象
public class UserController {
    @Resource(name = "userServiceImpl")
    private UserService userService;

    /**
     * 用户登录功能
     * @param user
     * @param session
     * @return
     */
    @RequestMapping(value = "/toLogin",method = RequestMethod.POST)
    @ResponseBody
    public MyResult toLogin(@RequestBody User user, HttpSession session, HttpServletRequest request){
        MyResult result = new MyResult();
        UserDO userDO=new UserDO();
        userDO.setUsername(user.getUsername());
        userDO.setPwd(user.getPwd());
        UserDO user2=userService.getUser(userDO);
        String reqCode= String.valueOf(session.getAttribute("reqCode"));
        if (user2==null){
            result.setCode(9999);
            result.setMsg("账号或密码错误");
            return result;
        }
        if (!reqCode.equalsIgnoreCase(user.getReqCode())){
            result.setCode(9999);
            result.setMsg("验证码错误");
            return result;
        }
        /**
         * 获取全局的session对象
         */
        ServletContext servletContext = request.getSession().getServletContext();
        /**
         * 已经登录的用户列表
         */
        HashMap<String,String>loginMap= (HashMap<String, String>) servletContext.getAttribute("loginMap");
        /**
         * 是否有登录用户列表
         */
        if (loginMap==null){
            /**
             * 没有，创建新的登录列表
             */
            loginMap=new HashMap<>();
            loginMap.put(user2.getUsername(),session.getId());
            servletContext.setAttribute("loginMap",loginMap);
        }else {
            /**
             * 有，判断当前用户是否登录
             */
            String sessionId=loginMap.get(user2.getUsername());
            if (sessionId==null){
                /**
                 * 当前用户未登录，列表中没有相应的key
                 */
                loginMap.put(user2.getUsername(),session.getId());
                servletContext.removeAttribute("loginMap");
                servletContext.setAttribute("loginMap",loginMap);
            }else {
                /**
                 * 已有相关的用户，
                 * 判断通过sessionID判断是否的当前设备请求的登录
                 */
                if (!sessionId.equals(session.getId())){
                    /**
                     * 不是当前用户请求登录，拦截，返回提示信息
                     */
                    result.setCode(9999);
                    result.setMsg("该用户已登录");
                    return result;
                }
            }
        }
        /**
         * session超时设置
         */
        session.setMaxInactiveInterval(60*30);
        /**
         * 保留session用于拦截器使用
         */
        session.setAttribute("userName",user2.getUsername());
        result.setCode(0000);
        result.setMsg("登录成功");
        return result;
    }
    @RequestMapping(value = "/reqCode",method = RequestMethod.POST)
    @ResponseBody
    public String toRecode(HttpSession session){
        GifCaptcha gifCaptcha = new GifCaptcha(80, 30, 4);
        String text = gifCaptcha.text();// 计算的文字结果值
        System.out.println("验证码：【"+text+"】");
        session.setMaxInactiveInterval(60);
        session.setAttribute("reqCode",text);
        //往前端返回一个图片
        String s = gifCaptcha.toBase64();
        return s;
    }
}
